<?php
namespace sql;

// require('./config/config.php');

class mysql
{
    private static $mysqli;

    private $result;
    /**
     * 数据库连接
     */
    public static function connect()
    {
        // 配置数据库
        $host = HOST;           //主机地址
        $username = USERNAME;   //用户名
        $password = PASSWORD;   //密码
        $dbname = DBNAME;       //数据库

        // 连接数据库
        self::$mysqli = mysqli_connect($host, $username, $password, $dbname);
        // 检测连接
        if (!self::$mysqli) {
            die("Connection failed: " . mysqli_connect_error() . "<br />");
        }
        
        // 设置编码
        mysqli_query(self::$mysqli, "set names utf8");
    }

    /**
     * 数据查询
     * 返回查询的结果
     * @param array $table 操作的数据库表名
     * @param array $field 需要返回的数据字段
     * @param array $where 查询条件
     * @return int $this->result 返回查询的结果
     */
    public function select($table, $field = null, $where = null)
    {
        // 拼接数据表数组为字符串
        $table = implode(',', $table);
        $sql = "SELECT * FROM {$table}";
        if (!empty($field)) {
            // 拼接字段数组为字符串
            $field = implode(',', $field);
            $sql = str_replace('*', $field, $sql);
        }
        if (!empty($where)) {
            $where = implode(' and ', $where);
            $sql = $sql . ' WHERE ' . $where;
        }
        $this->result = mysqli_query(self::$mysqli, $sql);
        if (!$this->result) {
            die('ERROR: ' . mysqli_error(self::$mysqli));
        } else {
            return $this->result;
        }
    }

    /**
     * 数据分组查询
     * @param array $table 操作的数据库表名
     * @param array $field 需要返回的数据字段
     * @param array $where 查询条件
     * @param array $group 分组的数据
     * @return int $row 返回改变的记录数
     */
    public function group($table, $field, $where, $group)
    {
        // 拼接数据表数组为字符串
        $table = implode(',', $table);
        $field = implode(',', $field);
        $where = implode(' and ', $where);
        $group = implode(' and ', $group);
        $sql = "SELECT {$field} FROM {$table} WHERE {$where} GROUP BY {$group} WITH ROLLUP";
        $this->result = mysqli_query(self::$mysqli, $sql);
        if (!$this->result) {
            die('ERROR: ' . mysqli_error(self::$mysqli));
        } else {
            return $this->result;
        }
    }

    /**
     * 插入数据
     * 返回插入的 id
     * @param array $table 操作的数据库表名
     * @param array $data 需要插入的数据
     * @return int $_id 返回插入的数据 id
     */
    public function insert($table, $data)
    {
        $table = implode(',', $table);
        // 转义 SQL 语句中使用的字符串中的特殊字符
        foreach ($data as $key => $value) {
            $data[$key] = mysqli_real_escape_string(self::$mysqli, $value);
        }
        $keys = implode(",", array_keys($data));
        $values = "'" . implode("','", array_values($data)) . "'";
        $sql = "INSERT INTO {$table}( {$keys} )VALUES( {$values} )";
        $this->result = mysqli_query(self::$mysqli, $sql);
        // 获取插入的数据 id
        $_id = mysqli_insert_id(self::$mysqli);
        if (!$this->result) {
            die('ERROR: ' . mysqli_error(self::$mysqli));
        } else {
            // echo '插入数据成功！插入数据的 id 是：' . $_id . '<br/>';
            return $_id;
        }
    }
    /**
     * 更新数据
     * @param array $table 操作的数据库表名
     * @param array $data 需要更新的数据
     * @param array $where 查询条件
     * @return int $row 返回改变的记录数
     */
    public function update($table, $data, $where)
    {
        $table = implode(',', $table);
        // 转义 SQL 语句中使用的字符串中的特殊字符
        foreach ($data as $key => $value) {
            $data[$key] = mysqli_real_escape_string(self::$mysqli, $value);
        }
        $sets = array();
        // 拼接需要更新的数据
        foreach ($data as $key => $value) {
            $sets[] = $key . "=" . "'" . $value . "'";
        }
        $kav = implode(",", $sets);
        $where = implode(' and ', $where);
        $sql = "UPDATE {$table} SET {$kav} WHERE {$where}";
        $retval = mysqli_query(self::$mysqli, $sql);
        // 获取改变的行数
        $row = mysqli_affected_rows(self::$mysqli);
        if (!$retval) {
            die('ERROR: ' . mysqli_error(self::$mysqli));
        } else {
            // echo '数据更新成功！已更新' . $row . '行数据。<br/>';
            return $row;
        }
    }

    /**
     * 删除数据
     * 返回 $row 改变的记录数
     * @param array $table 操作的数据库表名
     * @param array $where 查询条件
     * @return int $row 返回影响的数据行数
     */
    public function delete($table, $where)
    {
        $table = implode(',', $table);
        $where = implode(' and ', $where);
        $sql = "DELETE FROM {$table} WHERE {$where}";
        $retval = mysqli_query(self::$mysqli, $sql);
        if ($retval) {
            // 获取改变的行数
            $row = mysqli_affected_rows(self::$mysqli);
            // echo '删除数据成功！删除了' . $row . '行数据。<br />';
            return $row;
        } else {
            die('ERROR: ' . mysqli_error(self::$mysqli));
        }
    }

    /**
     * 转换结果为数组
     * @param array $data 需要转换的 mysql 对象
     * @return array $retval 转换后的数组
     */
    public function transform($data)
    {
        $retval = [];
        $i = 0;
        // 将每行数据转化为数组再进行拼接
        while ($row = mysqli_fetch_assoc($data)) {
            $retval[] = $row;
            $i += 1;
        }
        return $retval;
    }
}